iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0

Day28 Leetcode Array系列---- Spiral Matrix

本次題目 Spiral Matrix by js

題目希望以順時針的方式重新整合陣列

Example 1:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

思考路線

  1. 可以用 while 迴圈取值,迴圈圈數是依據傳入的陣列有多少元素
  2. 需要上下移動與左右移動
  3. 移動到邊緣的時候要怎麼處裡
  4. 要設定條件往內轉

Coding Time

用 move 判斷現在是朝向左右移動或上下移動

設 x y 取值, y 是上下層第幾層 x 是左右第幾個元素

準備 result 裝螺旋轉出來的值

迴圈終止是當 result 的元素量等同於傳入陣列的所有元素

input1 = 
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
output1 = [1,2,3,6,9,8,7,4,5]
input2 =
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
output2 = [1,2,3,4,8,12,11,10,9,5,6,7]

function sprial(ary){
  let move = 'right' // 判斷移動方向
  let x = 0
  let y = 0
  result = []
  while(result.length != ary.length * ary[0].length ){
    // result 陣列內元素與傳入陣列的元素一樣多時停止
    el = ary[y][x]
    result.push(el)
    if(move === 'right'){ // 判斷現在移動的方向
      if(ary[y][x+1] != undefined && result.indexOf(ary[y][x+1]) == -1){
        // 處理移動到邊緣要轉彎
        x += 1
      }else{
        move = 'down'
        y += 1
      }
    }else if(move == 'down'){
      if(ary[y+1] != undefined && result.indexOf(ary[y+1][x]) == -1){
        y += 1
      }else{
        move = 'left'
        x -= 1
      }
    }else if(move =='left'){
      if(ary[y][x-1] !=undefined && result.indexOf(ary[y][x-1]) == -1){
        x -= 1
      }else{
        move ='top'
        y -= 1
      }
    }else if( move == 'top'){
      if(ary[y-1] != undefined && result.indexOf(ary[y-1][x]) == -1){
        // 轉到內圈的條件,遇到已經存在於 reuslt 的元素要往內轉
        y -= 1
      }else{
        move = 'right'
        x += 1
      }
    }
  }
  return result
}
function expect(a,b){
  console.log( JSON.stringify(a) === JSON.stringify(b) )
}

expect(sprial(input1),output1)
expect(sprial(input2),output2)
  

這樣的寫法是把遇到邊緣該如何處理都加上去,有點冗長,如果傳入的陣列越大就需要判斷內圈的四個邊要如何往內轉

今天到此為止,有任何問題請在下方留言或透過email、GitHub聯絡我,感謝閱讀

Daily kitty


上一篇
Day27 ---- Minimum Size Subarray Sum
下一篇
Day29 ----Merge Intervals
系列文
菜雞的30天工程師轉職日記--Leetcode30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言